#include "stdafx.h"
#include "NetMsg.h"
#include "MsgAll.h"
#include "Network.h"

namespace cupid
{

NetMsg::NetMsg()
{
	init();
}

NetMsg::~NetMsg()
{

}

//////////////////////////////////////////////////////////////////////
void NetMsg::init()
{
	memset(m_bufMsg, 0L, sizeof(m_bufMsg));
	m_msgSize	=0;
	m_msgType	=_MSG_NONE;
}

//////////////////////////////////////////////////////////////////////
BOOL NetMsg::isValid(void)
{
	if(_MSG_NONE == this->getType())
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL NetMsg::create( char* msgBuf, DWORD dwSize )
{
	if(!msgBuf)
		return false;

	if((unsigned short)dwSize != getSize(msgBuf, dwSize))
		return false;

	if(_MSG_NONE == getType(msgBuf, dwSize))
		return false;

	memcpy(this->m_bufMsg, msgBuf, dwSize);
	return true;
}

//////////////////////////////////////////////////////////////////////
void NetMsg::process( void *info )
{
	//--------------------
	char szMsg[1024];
	sprintf_s(szMsg, "Process Msg:%d, Size:%d", m_msgType, m_msgSize);	
}

//////////////////////////////////////////////////////////////////////
void NetMsg::send(void)
{

	sNetwork->sendMsg(m_bufMsg, m_msgSize);
}

//////////////////////////////////////////////////////////////////////
// static functions;
//////////////////////////////////////////////////////////////////////
unsigned short	NetMsg::getType(char* bufMsg, DWORD dwMsgSize)
{
	// check it...
	assert(bufMsg);
	assert((int)dwMsgSize <= NetMsg::getMaxSize());

	unsigned short* pUnShort	=(unsigned short* )bufMsg;
	return pUnShort[1];
}

//////////////////////////////////////////////////////////////////////
unsigned short	NetMsg::getSize(char* bufMsg, DWORD dwMsgSize)
{
	// check it...
	assert(bufMsg);
	assert((int)dwMsgSize <= NetMsg::getMaxSize());

	unsigned short* pUnShort	=(unsigned short* )bufMsg;
	return pUnShort[0];
}

NetMsg* NetMsg::createMsg(char* bufMsg, DWORD dwMsgSize)
{
	// check it...
	if(!bufMsg || (int)dwMsgSize > getMaxSize())
		return NULL;

	assert((int)dwMsgSize == NetMsg::getSize(bufMsg, dwMsgSize));

	NetMsg* msg	=NULL;
	switch(NetMsg::getType(bufMsg,dwMsgSize))
	{
		_CREATE_NEW_MSG_
	}

	if(!msg)
		return NULL;

	if(!msg->create(bufMsg, dwMsgSize))
	{
		delete(msg);
		return NULL;
	}
	return msg;
}
}